CQRS(๋ช ๋ น ์กฐํ ์ฑ ์ ๋ถ๋ฆฌ)์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ก, ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์์คํ ๊ตฌ์ถ์ ์ํ ์์น, ์ด์ , ๊ตฌํ ์ ๋ต ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
CQRS: ๋ช ๋ น ์กฐํ ์ฑ ์ ๋ถ๋ฆฌ ์๋ฒฝ ๊ฐ์ด๋
๋์์์ด ์งํํ๋ ์ํํธ์จ์ด ์ํคํ ์ฒ์ ์ธ๊ณ์์ ๊ฐ๋ฐ์๋ค์ ํ์ฅ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฑ๋ฅ์ ์ฆ์ง์ํค๋ ํจํด๊ณผ ๊ดํ์ ๋์์์ด ์ฐพ๊ณ ์์ต๋๋ค. ์๋นํ ์ฃผ๋ชฉ์ ๋ฐ์ ํจํด ์ค ํ๋๊ฐ ๋ฐ๋ก CQRS(Command Query Responsibility Segregation, ๋ช ๋ น ์กฐํ ์ฑ ์ ๋ถ๋ฆฌ)์ ๋๋ค. ์ด ๊ธ์์๋ CQRS์ ์์น, ์ด์ , ๊ตฌํ ์ ๋ต ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ํ๊ตฌํ๋ฉฐ CQRS์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
CQRS๋ ๋ฌด์์ธ๊ฐ?
CQRS๋ ๋ฐ์ดํฐ ์ ์ฅ์์ ๋ํ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์์ ์ ๋ถ๋ฆฌํ๋ ์ํคํ ์ฒ ํจํด์ ๋๋ค. ์ด๋ ์์คํ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ์ธ '๋ช ๋ น(Command)'๊ณผ ์ํ๋ฅผ ์์ ํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ์์ ์ธ '์กฐํ(Query)'๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ณ๊ฐ์ ๋ชจ๋ธ์ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํฉ๋๋ค. ์ด๋ฌํ ๋ถ๋ฆฌ๋ฅผ ํตํด ๊ฐ ๋ชจ๋ธ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ต์ ํํ ์ ์์ด ์ฑ๋ฅ, ํ์ฅ์ฑ ๋ฐ ๋ณด์์ด ํฅ์๋ฉ๋๋ค.
์ ํต์ ์ธ ์ํคํ ์ฒ๋ ์ข ์ข ๋จ์ผ ๋ชจ๋ธ ๋ด์์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์์ ์ ๊ฒฐํฉํฉ๋๋ค. ์ฒ์์๋ ๊ตฌํ์ด ๋ ๊ฐ๋จํ์ง๋ง, ์ด ์ ๊ทผ ๋ฐฉ์์ ์์คํ ์ด ๋ณต์กํด์ง์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ๋ณ๋ชฉ ํ์: ๋จ์ผ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์์ ๋ชจ๋์ ์ต์ ํ๋์ง ์์ ์ ์์ต๋๋ค. ๋ณต์กํ ์ฟผ๋ฆฌ๋ ์ฐ๊ธฐ ์์ ์ ๋๋ฆฌ๊ฒ ํ ์ ์์ผ๋ฉฐ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
- ํ์ฅ์ฑ ํ๊ณ: ๋ชจ๋๋ฆฌ์ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ํ์ฅํ๋ ๊ฒ์ ์ด๋ ต๊ณ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ฌธ์ : ์ ์ฒด ์์คํ ์ ๊ฑธ์ณ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๊ฒ์ด ์ด๋ ค์์ง ์ ์์ผ๋ฉฐ, ํนํ ๋ถ์ฐ ํ๊ฒฝ์์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
- ๋ณต์กํ ๋๋ฉ์ธ ๋ก์ง: ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์์ ์ ๊ฒฐํฉํ๋ฉด ๋ณต์กํ๊ณ ๊ธด๋ฐํ๊ฒ ๊ฒฐํฉ๋ ์ฝ๋๊ฐ ๋์ด ์ ์ง๋ณด์ ๋ฐ ๋ฐ์ ์ด ๋ ์ด๋ ค์์ง๋๋ค.
CQRS๋ ๊ด์ฌ์ฌ์ ๋ช ํํ ๋ถ๋ฆฌ๋ฅผ ๋์ ํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ๊ฐ ๋ชจ๋ธ์ ํน์ ์๊ตฌ์ ๋ง๊ฒ ์กฐ์ ํ ์ ์๋๋ก ํฉ๋๋ค.
CQRS์ ํต์ฌ ์์น
CQRS๋ ์ฌ๋ฌ ํต์ฌ ์์น์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
- ๊ด์ฌ์ฌ ๋ถ๋ฆฌ: ๊ทผ๋ณธ์ ์ธ ์์น์ ๋ช ๋ น๊ณผ ์กฐํ ์ฑ ์์ ๋ณ๊ฐ์ ๋ชจ๋ธ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
- ๋ ๋ฆฝ์ ์ธ ๋ชจ๋ธ: ๋ช ๋ น ๋ชจ๋ธ๊ณผ ์กฐํ ๋ชจ๋ธ์ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ตฌ์กฐ, ๊ธฐ์ , ์ฌ์ง์ด ๋ฌผ๋ฆฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ ๋ฆฝ์ ์ธ ์ต์ ํ ๋ฐ ํ์ฅ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋ฐ์ดํฐ ๋๊ธฐํ: ์ฝ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฐ๊ธฐ ๋ชจ๋ธ์ด ๋ถ๋ฆฌ๋์ด ์์ผ๋ฏ๋ก ๋ฐ์ดํฐ ๋๊ธฐํ๊ฐ ์ค์ํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋น๋๊ธฐ ๋ฉ์์ง์ด๋ ์ด๋ฒคํธ ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ฌ์ฑ๋ฉ๋๋ค.
- ์ต์ข ์ ์ผ๊ด์ฑ: CQRS๋ ์ข ์ข ์ต์ข ์ ์ผ๊ด์ฑ์ ์ฑํํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๊ฐ ์ฝ๊ธฐ ๋ชจ๋ธ์ ์ฆ์ ๋ฐ์๋์ง ์์ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ก ์ธํด ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ด ํฅ์๋์ง๋ง ์ฌ์ฉ์์ ๋ํ ์ ์ฌ์ ์ํฅ์ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
CQRS์ ์ด์
CQRS๋ฅผ ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ง์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ํฅ์: ์ฝ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฐ๊ธฐ ๋ชจ๋ธ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ต์ ํํจ์ผ๋ก์จ CQRS๋ ์ ๋ฐ์ ์ธ ์์คํ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ฝ๊ธฐ ๋ชจ๋ธ์ ๋น ๋ฅธ ๋ฐ์ดํฐ ๊ฒ์์ ์ํด ํน๋ณํ ์ค๊ณ๋ ์ ์์ผ๋ฉฐ, ์ฐ๊ธฐ ๋ชจ๋ธ์ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ์ ์ง์คํ ์ ์์ต๋๋ค.
- ํ์ฅ์ฑ ๊ฐํ: ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ๋ชจ๋ธ์ ๋ถ๋ฆฌ๋ก ๋ ๋ฆฝ์ ์ธ ํ์ฅ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฆ๊ฐ๋ ์กฐํ ๋ถํ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ, ์ฐ๊ธฐ ์์ ์ ์ค๋ฉ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ณ๋๋ก ํ์ฅํ ์ ์์ต๋๋ค.
- ๋จ์ํ๋ ๋๋ฉ์ธ ๋ก์ง: CQRS๋ ๋ช ๋ น ์ฒ๋ฆฌ์ ์กฐํ ์ฒ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๋ณต์กํ ๋๋ฉ์ธ ๋ก์ง์ ๋จ์ํํ ์ ์์ต๋๋ค. ์ด๋ ๋ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ณ ํ ์คํธ ๊ฐ๋ฅํ ์ฝ๋๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ์ ์ฐ์ฑ ์ฆ๊ฐ: ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ๋ชจ๋ธ์ ์๋ก ๋ค๋ฅธ ๊ธฐ์ ์ ์ฌ์ฉํ๋ฉด ๊ฐ ์์ ์ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ ํํ๋ ๋ฐ ๋ ํฐ ์ ์ฐ์ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค.
- ๋ณด์ ํฅ์: ๋ช ๋ น ๋ชจ๋ธ์ ๋ ์๊ฒฉํ ๋ณด์ ์ ์ฝ ์กฐ๊ฑด์ผ๋ก ์ค๊ณํ ์ ์์ผ๋ฉฐ, ์ฝ๊ธฐ ๋ชจ๋ธ์ ๊ณต๊ฐ์ ์ธ ์ฌ์ฉ์ ์ต์ ํ๋ ์ ์์ต๋๋ค.
- ๊ฐ์ฌ ์ฉ์ด์ฑ ํฅ์: ์ด๋ฒคํธ ์์ฑ๊ณผ ๊ฒฐํฉ๋ ๋ CQRS๋ ์์คํ ์ํ์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์์ ํ ๊ฐ์ฌ ์ถ์ ์ ์ ๊ณตํฉ๋๋ค.
์ธ์ CQRS๋ฅผ ์ฌ์ฉํด์ผ ํ๋๊ฐ
CQRS๋ ๋ง์ ์ด์ ์ ์ ๊ณตํ์ง๋ง ๋ง๋ณํต์น์ฝ์ ์๋๋๋ค. ํน์ ํ๋ก์ ํธ์ CQRS๊ฐ ์ ํฉํ ์ ํ์ธ์ง ์ ์คํ๊ฒ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. CQRS๋ ๋ค์๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค์์ ๊ฐ์ฅ ์ ์ฉํฉ๋๋ค.
- ๋ณต์กํ ๋๋ฉ์ธ ๋ชจ๋ธ: ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์์ ์ ๋ํด ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ํํ์ด ํ์ํ ๋ณต์กํ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ฐ์ง ์์คํ .
- ๋์ ์ฝ๊ธฐ/์ฐ๊ธฐ ๋น์จ: ์ฐ๊ธฐ ๋ณผ๋ฅจ๋ณด๋ค ์ฝ๊ธฐ ๋ณผ๋ฅจ์ด ํ์ ํ ๋์ ์ ํ๋ฆฌ์ผ์ด์ .
- ํ์ฅ์ฑ ์๊ตฌ์ฌํญ: ๋์ ํ์ฅ์ฑ๊ณผ ์ฑ๋ฅ์ด ์๊ตฌ๋๋ ์์คํ .
- ์ด๋ฒคํธ ์์ฑ๊ณผ์ ํตํฉ: ์ง์์ฑ ๋ฐ ๊ฐ์ฌ๋ฅผ ์ํด ์ด๋ฒคํธ ์์ฑ์ ์ฌ์ฉํ ๊ณํ์ธ ํ๋ก์ ํธ.
- ๋ ๋ฆฝ์ ์ธ ํ ์ฑ ์: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ธฐ ์ธก๊ณผ ์ฐ๊ธฐ ์ธก์ ๋ค๋ฅธ ํ์ด ์ฑ ์์ง๋ ๊ฒฝ์ฐ.
๋ฐ๋๋ก, ๊ฐ๋จํ CRUD ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ํ์ฅ์ฑ ์๊ตฌ์ฌํญ์ด ๋ฎ์ ์์คํ ์๋ CQRS๊ฐ ์ต์ ์ ์ ํ์ด ์๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ CQRS์ ์ถ๊ฐ์ ์ธ ๋ณต์ก์ฑ์ด ๊ทธ ์ด์ ์ ์์ํ ์ ์์ต๋๋ค.
CQRS ๊ตฌํํ๊ธฐ
CQRS๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์ฌ๋ฌ ํต์ฌ ๊ตฌ์ฑ ์์๊ฐ ํ์ํฉ๋๋ค.
- ๋ช ๋ น(Commands): ๋ช ๋ น์ ์์คํ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ ์๋๋ฅผ ๋ํ๋ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก 'CreateCustomer', 'UpdateProduct'์ ๊ฐ์ ๋ช ๋ นํ ๋์ฌ๋ก ๋ช ๋ช ๋ฉ๋๋ค. ๋ช ๋ น์ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ปค๋งจ๋ ํธ๋ค๋ฌ๋ก ์ ๋ฌ๋ฉ๋๋ค.
- ์ปค๋งจ๋ ํธ๋ค๋ฌ(Command Handlers): ์ปค๋งจ๋ ํธ๋ค๋ฌ๋ ๋ช ๋ น์ ์คํํ๋ ์ฑ ์์ ์ง๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋๋ฉ์ธ ๋ชจ๋ธ๊ณผ ์ํธ ์์ฉํ์ฌ ์์คํ ์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์กฐํ(Queries): ์กฐํ๋ ๋ฐ์ดํฐ ์์ฒญ์ ๋ํ๋ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก 'GetCustomerById', 'ListProducts'์ ๊ฐ์ ์ค๋ช ์ ์ธ ๋ช ์ฌ๋ก ๋ช ๋ช ๋ฉ๋๋ค. ์กฐํ๋ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฟผ๋ฆฌ ํธ๋ค๋ฌ๋ก ์ ๋ฌ๋ฉ๋๋ค.
- ์ฟผ๋ฆฌ ํธ๋ค๋ฌ(Query Handlers): ์ฟผ๋ฆฌ ํธ๋ค๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ์ฑ ์์ ์ง๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์กฐํ๋ฅผ ์ถฉ์กฑ์ํค๊ธฐ ์ํด ์ฝ๊ธฐ ๋ชจ๋ธ๊ณผ ์ํธ ์์ฉํฉ๋๋ค.
- ์ปค๋งจ๋ ๋ฒ์ค(Command Bus): ์ปค๋งจ๋ ๋ฒ์ค๋ ๋ช ๋ น์ ์ ์ ํ ์ปค๋งจ๋ ํธ๋ค๋ฌ๋ก ๋ผ์ฐํ ํ๋ ์ค์ฌ์์ ๋๋ค.
- ์ฟผ๋ฆฌ ๋ฒ์ค(Query Bus): ์ฟผ๋ฆฌ ๋ฒ์ค๋ ์กฐํ๋ฅผ ์ ์ ํ ์ฟผ๋ฆฌ ํธ๋ค๋ฌ๋ก ๋ผ์ฐํ ํ๋ ์ค์ฌ์์ ๋๋ค.
- ์ฝ๊ธฐ ๋ชจ๋ธ(Read Model): ์ฝ๊ธฐ ๋ชจ๋ธ์ ์ฝ๊ธฐ ์์ ์ ์ต์ ํ๋ ๋ฐ์ดํฐ ์ ์ฅ์์ ๋๋ค. ์กฐํ ์ฑ๋ฅ์ ์ํด ํน๋ณํ ์ค๊ณ๋ ๋ฐ์ดํฐ์ ๋น์ ๊ทํ๋ ๋ทฐ์ผ ์ ์์ต๋๋ค.
- ์ฐ๊ธฐ ๋ชจ๋ธ(Write Model): ์ฐ๊ธฐ ๋ชจ๋ธ์ ์์คํ ์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ ๊ทํ๋์ด ์์ผ๋ฉฐ ์ฐ๊ธฐ ์์ ์ ์ต์ ํ๋์ด ์์ต๋๋ค.
- ์ด๋ฒคํธ ๋ฒ์ค(Event Bus, ์ ํ ์ฌํญ): ์ด๋ฒคํธ ๋ฒ์ค๋ ๋๋ฉ์ธ ์ด๋ฒคํธ๋ฅผ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์ด ์ด๋ฒคํธ๋ ์ฝ๊ธฐ ๋ชจ๋ธ์ ํฌํจํ ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ์๋น๋ ์ ์์ต๋๋ค.
์์: ์ ์์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด ๋ด ์๋ค. ์ ํต์ ์ธ ์ํคํ ์ฒ์์๋ ๋จ์ผ 'Product' ์ํฐํฐ๊ฐ ์ ํ ์ ๋ณด ํ์์ ์ ํ ์ธ๋ถ ์ ๋ณด ์ ๋ฐ์ดํธ ๋ชจ๋์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
CQRS ๊ตฌํ์์๋ ์ฝ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฐ๊ธฐ ๋ชจ๋ธ์ ๋ถ๋ฆฌํฉ๋๋ค.
- ๋ช ๋ น ๋ชจ๋ธ:
- `CreateProductCommand`: ์ ์ ํ์ ์์ฑํ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.
- `UpdateProductPriceCommand`: ์ ํ ID์ ์ ๊ฐ๊ฒฉ์ ํฌํจํฉ๋๋ค.
- `CreateProductCommandHandler`: `CreateProductCommand`๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ฐ๊ธฐ ๋ชจ๋ธ์ ์ `Product` ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ์์ฑํฉ๋๋ค.
- `UpdateProductPriceCommandHandler`: `UpdateProductPriceCommand`๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ฐ๊ธฐ ๋ชจ๋ธ์์ ์ ํ ๊ฐ๊ฒฉ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์กฐํ ๋ชจ๋ธ:
- `GetProductDetailsQuery`: ์ ํ ID๋ฅผ ํฌํจํฉ๋๋ค.
- `ListProductsQuery`: ํํฐ๋ง ๋ฐ ํ์ด์ง๋ค์ด์ ๋งค๊ฐ๋ณ์๋ฅผ ํฌํจํฉ๋๋ค.
- `GetProductDetailsQueryHandler`: ํ์์ ์ต์ ํ๋ ์ฝ๊ธฐ ๋ชจ๋ธ์์ ์ ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ฒ์ํฉ๋๋ค.
- `ListProductsQueryHandler`: ์ง์ ๋ ํํฐ์ ํ์ด์ง๋ค์ด์ ์ ์ ์ฉํ์ฌ ์ฝ๊ธฐ ๋ชจ๋ธ์์ ์ ํ ๋ชฉ๋ก์ ๊ฒ์ํฉ๋๋ค.
์ฝ๊ธฐ ๋ชจ๋ธ์ ์ ํ๋ช , ์ค๋ช , ๊ฐ๊ฒฉ, ์ด๋ฏธ์ง์ ๊ฐ์ด ํ์์ ํ์ํ ์ ๋ณด๋ง ํฌํจํ๋ ์ ํ ๋ฐ์ดํฐ์ ๋น์ ๊ทํ๋ ๋ทฐ์ผ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ๋ฌ ํ ์ด๋ธ์ ์กฐ์ธํ ํ์ ์์ด ์ ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์์ต๋๋ค.
`CreateProductCommand`๊ฐ ์คํ๋๋ฉด, `CreateProductCommandHandler`๋ ์ฐ๊ธฐ ๋ชจ๋ธ์ ์๋ก์ด `Product` ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ `ProductCreatedEvent`๋ฅผ ๋ฐ์์ํค๊ณ , ์ด๋ ์ด๋ฒคํธ ๋ฒ์ค์ ๊ฒ์๋ฉ๋๋ค. ๋ณ๋์ ํ๋ก์ธ์ค๊ฐ ์ด ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ฝ๊ธฐ ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
๋ฐ์ดํฐ ๋๊ธฐํ ์ ๋ต
์ฐ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฝ๊ธฐ ๋ชจ๋ธ ๊ฐ์ ๋ฐ์ดํฐ ๋๊ธฐํ๋ฅผ ์ํด ์ฌ๋ฌ ์ ๋ต์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ด๋ฒคํธ ์์ฑ: ์ด๋ฒคํธ ์์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์ด๋ฒคํธ ์ํ์ค๋ก ์ง์์ํต๋๋ค. ์ฝ๊ธฐ ๋ชจ๋ธ์ ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ์ฌ์ํ์ฌ ๊ตฌ์ถ๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์์ ํ ๊ฐ์ฌ ์ถ์ ์ ์ ๊ณตํ๋ฉฐ ์ฒ์๋ถํฐ ์ฝ๊ธฐ ๋ชจ๋ธ์ ์ฌ๊ตฌ์ถํ ์ ์๊ฒ ํฉ๋๋ค.
- ๋น๋๊ธฐ ๋ฉ์์ง: ๋น๋๊ธฐ ๋ฉ์์ง์ ๋ฉ์์ง ํ๋ ๋ธ๋ก์ปค์ ์ด๋ฒคํธ๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ฝ๊ธฐ ๋ชจ๋ธ์ ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์์ ์ ์ ๋ฐ์ดํธํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฐ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฝ๊ธฐ ๋ชจ๋ธ ๊ฐ์ ๋์จํ ๊ฒฐํฉ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณต์ : ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณต์ ๋ ์ฐ๊ธฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฝ๊ธฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ตฌํ์ด ๋ ๊ฐ๋จํ์ง๋ง ์ง์ฐ ์๊ฐ๊ณผ ์ผ๊ด์ฑ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ต๋๋ค.
CQRS์ ์ด๋ฒคํธ ์์ฑ
CQRS์ ์ด๋ฒคํธ ์์ฑ์ ์๋ก๋ฅผ ์ ๋ณด์ํ๊ธฐ ๋๋ฌธ์ ์ข ์ข ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฒคํธ ์์ฑ์ ์ฐ๊ธฐ ๋ชจ๋ธ์ ์ง์์ํค๊ณ ์ฝ๊ธฐ ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํ๊ธฐ ์ํ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ ์์ฐ์ค๋ฌ์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. CQRS์ ์ด๋ฒคํธ ์์ฑ์ด ๊ฒฐํฉ๋๋ฉด ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
- ์์ ํ ๊ฐ์ฌ ์ถ์ : ์ด๋ฒคํธ ์์ฑ์ ์์คํ ์ํ์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์์ ํ ๊ฐ์ฌ ์ถ์ ์ ์ ๊ณตํฉ๋๋ค.
- ์๊ฐ ์ฌํ ๋๋ฒ๊น : ์ด๋ฒคํธ ์์ฑ์ ์ฌ์ฉํ๋ฉด ์ด๋ฒคํธ๋ฅผ ์ฌ์ํ์ฌ ํน์ ์์ ์ ์์คํ ์ํ๋ฅผ ์ฌ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ด๋ ๋๋ฒ๊น ๋ฐ ๊ฐ์ฌ์ ๋งค์ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
- ์๊ฐ์ ์ฟผ๋ฆฌ: ์ด๋ฒคํธ ์์ฑ์ ํน์ ์์ ์ ์กด์ฌํ๋ ์์คํ ์ํ๋ฅผ ์ฟผ๋ฆฌํ ์ ์๋ ์๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์์ฌ์ด ์ฝ๊ธฐ ๋ชจ๋ธ ์ฌ๊ตฌ์ถ: ์ด๋ฒคํธ๋ฅผ ์ฌ์ํ์ฌ ์ฝ๊ธฐ ๋ชจ๋ธ์ ์ฒ์๋ถํฐ ์ฝ๊ฒ ์ฌ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฒคํธ ์์ฑ์ ์์คํ ์ ๋ณต์ก์ฑ์ ๋ํ๊ธฐ๋ ํฉ๋๋ค. ์ด๋ฒคํธ ๋ฒ์ ๊ด๋ฆฌ, ์คํค๋ง ์งํ ๋ฐ ์ด๋ฒคํธ ์ ์ฅ์ ๋ํ ์ ์คํ ๊ณ ๋ ค๊ฐ ํ์ํฉ๋๋ค.
๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์์ CQRS
CQRS๋ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์ ์์ฐ์ค๋ฝ๊ฒ ๋ค์ด๋ง์ต๋๋ค. ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ CQRS๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌํํ์ฌ ๊ฐ ์๋น์ค ๋ด์์ ์ต์ ํ๋ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ๋ชจ๋ธ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ ๋์จํ ๊ฒฐํฉ, ํ์ฅ์ฑ ๋ฐ ๋ ๋ฆฝ์ ์ธ ๋ฐฐํฌ๋ฅผ ์ด์งํฉ๋๋ค.
๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ์ด๋ฒคํธ ๋ฒ์ค๋ ์ข ์ข Apache Kafka๋ RabbitMQ์ ๊ฐ์ ๋ถ์ฐ ๋ฉ์์ง ํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ๋น๋๊ธฐ ํต์ ์ด ๊ฐ๋ฅํ๋ฉฐ ์ด๋ฒคํธ๊ฐ ์์ ์ ์ผ๋ก ์ ๋ฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์: ๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ํ๋ซํผ
๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ๋ ๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์๊ฐํด ๋ด ์๋ค. ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ ๋ค์๊ณผ ๊ฐ์ ํน์ ๋๋ฉ์ธ ์์ญ์ ์ฑ ์์ง ์ ์์ต๋๋ค.
- ์ ํ ์นดํ๋ก๊ทธ: ์ ํ๋ช , ์ค๋ช , ๊ฐ๊ฒฉ, ์ด๋ฏธ์ง ๋ฑ ์ ํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ์ฃผ๋ฌธ ๊ด๋ฆฌ: ์ฃผ๋ฌธ ์์ฑ, ์ฒ๋ฆฌ, ์ดํ์ ํฌํจํ ์ฃผ๋ฌธ์ ๊ด๋ฆฌํฉ๋๋ค.
- ๊ณ ๊ฐ ๊ด๋ฆฌ: ํ๋กํ, ์ฃผ์, ๊ฒฐ์ ๋ฐฉ๋ฒ์ ํฌํจํ ๊ณ ๊ฐ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ์ฌ๊ณ ๊ด๋ฆฌ: ์ฌ๊ณ ์์ค๊ณผ ์ฌ๊ณ ๊ฐ์ฉ์ฑ์ ๊ด๋ฆฌํฉ๋๋ค.
์ด๋ฌํ ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ CQRS๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ ์นดํ๋ก๊ทธ ๋ง์ดํฌ๋ก์๋น์ค๋ ์ ํ ์ ๋ณด์ ๋ํด ๋ณ๋์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ๋ชจ๋ธ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ฐ๊ธฐ ๋ชจ๋ธ์ ๋ชจ๋ ์ ํ ์์ฑ์ ํฌํจํ๋ ์ ๊ทํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ผ ์ ์์ผ๋ฉฐ, ์ฝ๊ธฐ ๋ชจ๋ธ์ ์น์ฌ์ดํธ์ ์ ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์ํ๋ ๋ฐ ์ต์ ํ๋ ๋น์ ๊ทํ๋ ๋ทฐ์ผ ์ ์์ต๋๋ค.
์ ์ ํ์ด ์์ฑ๋๋ฉด ์ ํ ์นดํ๋ก๊ทธ ๋ง์ดํฌ๋ก์๋น์ค๋ ๋ฉ์์ง ํ์ `ProductCreatedEvent`๋ฅผ ๊ฒ์ํฉ๋๋ค. ์ฃผ๋ฌธ ๊ด๋ฆฌ ๋ง์ดํฌ๋ก์๋น์ค๋ ์ด ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๊ณ ์ฃผ๋ฌธ ์์ฝ์ ์ ์ ํ์ ํฌํจํ๋๋ก ๋ก์ปฌ ์ฝ๊ธฐ ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ๊ณ ๊ฐ ๊ด๋ฆฌ ๋ง์ดํฌ๋ก์๋น์ค๋ ๊ณ ๊ฐ์ ์ํ ์ ํ ์ถ์ฒ์ ๊ฐ์ธํํ๊ธฐ ์ํด `ProductCreatedEvent`๋ฅผ ๊ตฌ๋ ํ ์ ์์ต๋๋ค.
CQRS์ ๊ณผ์
CQRS๋ ๋ง์ ์ด์ ์ ์ ๊ณตํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ง ๊ณผ์ ๋ ์์ต๋๋ค.
- ๋ณต์ก์ฑ ์ฆ๊ฐ: CQRS๋ ์์คํ ์ํคํ ์ฒ์ ๋ณต์ก์ฑ์ ๋ํฉ๋๋ค. ์ฝ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฐ๊ธฐ ๋ชจ๋ธ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋๊ธฐํ๋๋๋ก ์ ์คํ ๊ณํ๊ณผ ์ค๊ณ๊ฐ ํ์ํฉ๋๋ค.
- ์ต์ข ์ ์ผ๊ด์ฑ: CQRS๋ ์ข ์ข ์ต์ข ์ ์ผ๊ด์ฑ์ ์ฑํํ๋๋ฐ, ์ด๋ ์ฆ๊ฐ์ ์ธ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ํ๋ ์ฌ์ฉ์์๊ฒ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๋๊ธฐํ: ์ฝ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฐ๊ธฐ ๋ชจ๋ธ ๊ฐ์ ๋ฐ์ดํฐ ๋๊ธฐํ๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋ณต์กํ ์ ์์ผ๋ฉฐ ๋ฐ์ดํฐ ๋ถ์ผ์น ๊ฐ๋ฅ์ฑ์ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ์ธํ๋ผ ์๊ตฌ์ฌํญ: CQRS๋ ์ข ์ข ๋ฉ์์ง ํ ๋ฐ ์ด๋ฒคํธ ์ ์ฅ์์ ๊ฐ์ ์ถ๊ฐ ์ธํ๋ผ๊ฐ ํ์ํฉ๋๋ค.
- ํ์ต ๊ณก์ : ๊ฐ๋ฐ์๋ CQRS๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๊ธฐ ์ํด ์๋ก์ด ๊ฐ๋ ๊ณผ ๊ธฐ์ ์ ๋ฐฐ์์ผ ํฉ๋๋ค.
CQRS๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
CQRS๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ตฌํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋จ์ํ๊ฒ ์์ํ๊ธฐ: ํ ๋ฒ์ ๋ชจ๋ ๊ณณ์ CQRS๋ฅผ ๊ตฌํํ๋ ค๊ณ ํ์ง ๋ง์ญ์์ค. ์์คํ ์ ์๊ณ ๊ณ ๋ฆฝ๋ ์์ญ์์ ์์ํ์ฌ ํ์์ ๋ฐ๋ผ ์ ์ฐจ์ ์ผ๋ก ์ฌ์ฉ์ ํ์ฅํ์ญ์์ค.
- ๋น์ฆ๋์ค ๊ฐ์น์ ์ง์คํ๊ธฐ: CQRS๊ฐ ๊ฐ์ฅ ํฐ ๋น์ฆ๋์ค ๊ฐ์น๋ฅผ ์ ๊ณตํ ์ ์๋ ์์คํ ์์ญ์ ์ ํํ์ญ์์ค.
- ์ด๋ฒคํธ ์์ฑ ํ๋ช ํ๊ฒ ์ฌ์ฉํ๊ธฐ: ์ด๋ฒคํธ ์์ฑ์ ๊ฐ๋ ฅํ ๋๊ตฌ์ผ ์ ์์ง๋ง ๋ณต์ก์ฑ์ ๋ํฉ๋๋ค. ๋น์ฉ๋ณด๋ค ์ด์ ์ด ํด ๋๋ง ์ฌ์ฉํ์ญ์์ค.
- ๋ชจ๋ํฐ๋ง ๋ฐ ์ธก์ : ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ ํ์์ ๋ฐ๋ผ ์กฐ์ ํ์ญ์์ค.
- ๋ฐ์ดํฐ ๋๊ธฐํ ์๋ํ: ๋ฐ์ดํฐ ๋ถ์ผ์น ๊ฐ๋ฅ์ฑ์ ์ต์ํํ๊ธฐ ์ํด ์ฝ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฐ๊ธฐ ๋ชจ๋ธ ๊ฐ์ ๋ฐ์ดํฐ ๋๊ธฐํ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ์ญ์์ค.
- ๋ช ํํ๊ฒ ์ํตํ๊ธฐ: ์ต์ข ์ ์ผ๊ด์ฑ์ ์ํฅ์ ์ฌ์ฉ์์๊ฒ ๋ช ํํ๊ฒ ์ ๋ฌํ์ญ์์ค.
- ์ฒ ์ ํ๊ฒ ๋ฌธ์ํํ๊ธฐ: ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ดํดํ๊ณ ์ ์ง๋ณด์ํ ์ ์๋๋ก CQRS ๊ตฌํ์ ์ฒ ์ ํ๊ฒ ๋ฌธ์ํํ์ญ์์ค.
CQRS ๋๊ตฌ ๋ฐ ํ๋ ์์ํฌ
CQRS ๊ตฌํ์ ๋จ์ํํ๋ ๋ฐ ๋์์ด ๋๋ ์ฌ๋ฌ ๋๊ตฌ์ ํ๋ ์์ํฌ๊ฐ ์์ต๋๋ค.
- MediatR (C#): ๋ช ๋ น, ์ฟผ๋ฆฌ, ์ด๋ฒคํธ๋ฅผ ์ง์ํ๋ .NET์ฉ ๊ฐ๋จํ ์ค์ฌ์ ๊ตฌํ.
- Axon Framework (Java): CQRS ๋ฐ ์ด๋ฒคํธ ์์ฑ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํ ํฌ๊ด์ ์ธ ํ๋ ์์ํฌ.
- Broadway (PHP): PHP์ฉ CQRS ๋ฐ ์ด๋ฒคํธ ์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
- EventStoreDB: ์ด๋ฒคํธ ์์ฑ์ ์ํด ํน๋ณํ ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค.
- Apache Kafka: ์ด๋ฒคํธ ๋ฒ์ค๋ก ์ฌ์ฉํ ์ ์๋ ๋ถ์ฐ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ.
- RabbitMQ: ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ๋น๋๊ธฐ ํต์ ์ ์ฌ์ฉํ ์ ์๋ ๋ฉ์์ง ๋ธ๋ก์ปค.
CQRS์ ์ค์ ์ฌ๋ก
๋ง์ ๋๊ธฐ์ ๋ค์ด ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์์คํ ์ ๊ตฌ์ถํ๊ธฐ ์ํด CQRS๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์์ ๋๋ค.
- ๋ทํ๋ฆญ์ค(Netflix): ๋ทํ๋ฆญ์ค๋ ๋ฐฉ๋ํ ์ํ ๋ฐ TV ์ผ ์นดํ๋ก๊ทธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด CQRS๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํฉ๋๋ค.
- ์๋ง์กด(Amazon): ์๋ง์กด์ ๋์ ํธ๋์ญ์ ๋ณผ๋ฅจ๊ณผ ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ์์๊ฑฐ๋ ํ๋ซํผ์์ CQRS๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋งํฌ๋์ธ(LinkedIn): ๋งํฌ๋์ธ์ ์ฌ์ฉ์ ํ๋กํ๊ณผ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์์ ๋คํธ์ํน ํ๋ซํผ์์ CQRS๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ง์ดํฌ๋ก์ํํธ(Microsoft): ๋ง์ดํฌ๋ก์ํํธ๋ Azure ๋ฐ Office 365์ ๊ฐ์ ํด๋ผ์ฐ๋ ์๋น์ค์์ CQRS๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฌํ ์๋ค์ CQRS๊ฐ ์ ์์๊ฑฐ๋ ํ๋ซํผ์์ ์์ ๋คํธ์ํน ์ฌ์ดํธ์ ์ด๋ฅด๊ธฐ๊น์ง ๊ด๋ฒ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๊ณต์ ์ผ๋ก ์ ์ฉ๋ ์ ์์์ ๋ณด์ฌ์ค๋๋ค.
๊ฒฐ๋ก
CQRS๋ ๋ณต์กํ ์์คํ ์ ํ์ฅ์ฑ, ์ ์ง๋ณด์์ฑ ๋ฐ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ ๊ฐ๋ ฅํ ์ํคํ ์ฒ ํจํด์ ๋๋ค. ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์์ ์ ๋ณ๊ฐ์ ๋ชจ๋ธ๋ก ๋ถ๋ฆฌํจ์ผ๋ก์จ CQRS๋ ๋ ๋ฆฝ์ ์ธ ์ต์ ํ ๋ฐ ํ์ฅ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. CQRS๋ ์ถ๊ฐ์ ์ธ ๋ณต์ก์ฑ์ ์ผ๊ธฐํ์ง๋ง, ๋ง์ ์๋๋ฆฌ์ค์์ ๊ทธ ์ด์ ์ด ๋น์ฉ์ ๋ฅ๊ฐํ ์ ์์ต๋๋ค. CQRS์ ์์น, ์ด์ ๋ฐ ๊ณผ์ ๋ฅผ ์ดํดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์ด ํจํด์ ํ๋ก์ ํธ์ ์ธ์ ์ด๋ป๊ฒ ์ ์ฉํ ์ง์ ๋ํด ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค.
๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ, ๋ณต์กํ ๋๋ฉ์ธ ๋ชจ๋ธ ๋๋ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ , CQRS๋ ์ํคํ ์ฒ ๋ฌด๊ธฐ๊ณ ์์ ๊ท์คํ ๋๊ตฌ๊ฐ ๋ ์ ์์ต๋๋ค. CQRS์ ๊ด๋ จ ํจํด์ ์ฑํํจ์ผ๋ก์จ ๋ณ๊ฒฝ์ ๋ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ํ๋ ฅ์ ์ธ ์์คํ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ถ๊ฐ ํ์ต ์๋ฃ
- ๋งํด ํ์ธ๋ฌ์ CQRS ๊ธ: https://martinfowler.com/bliki/CQRS.html
- ๊ทธ๋ ์์ CQRS ๋ฌธ์: "Greg Young CQRS"๋ก ๊ฒ์ํ์ฌ ์ฐพ์ ์ ์์ต๋๋ค.
- ๋ง์ดํฌ๋ก์ํํธ ๋ฌธ์: Microsoft Docs์์ CQRS ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ ๊ฐ์ด๋๋ผ์ธ์ ๊ฒ์ํ์ญ์์ค.
์ด CQRS ํ๊ตฌ๋ ์ด ๊ฐ๋ ฅํ ์ํคํ ์ฒ ํจํด์ ์ดํดํ๊ณ ๊ตฌํํ๊ธฐ ์ํ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ์ ์ ๊ณตํฉ๋๋ค. CQRS ์ฑํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ๋ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ์ฌํญ๊ณผ ๋งฅ๋ฝ์ ๊ณ ๋ คํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ์ํคํ ์ฒ ์ฌ์ ์ ํ์ด์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!